ANÁLISIS ESTADÍSTICO PRODUCCIÓN DE MAÍZ
1 Resumen
En este informe, transformamos un conjunto de datos brutos de las Evaluaciones Agropecuarias Municipales (EVA) en inteligencia de negocio. Realizamos un preprocesamiento exhaustivo de los datos de Maíz, que incluyó limpieza, imputación de datos faltantes con MICE y un tratamiento objetivo de outliers para construir una base de datos robusta. El análisis exploratorio reveló distintas trayectorias de rendimiento entre los departamentos, destacando el impresionante crecimiento de Huila hasta alcanzar el liderazgo, la alta productividad del Valle del Cauca, y el estancamiento de otras regiones clave. El resultado final es un conjunto de conclusiones estratégicas sobre las tendencias y oportunidades regionales para la compañía.
2 Introducción
Una importante empresa agrícola nacional, con un vasto portafolio de cultivos, se encuentra en una encrucijada estratégica. Para fortalecer su liderazgo en el mercado, necesita optimizar su operación de maíz, un pilar fundamental de su negocio. La dirección ha planteado preguntas clave: ¿En qué regiones debemos invertir? ¿Dónde se encuentran nuestras operaciones más eficientes? ¿Qué lecciones nos ha dejado la última década?
Para responder, se nos ha entregado una base de datos histórica, consolidada por un equipo anterior. Sin embargo, este activo digital presenta un desafío inicial: datos desorganizados, inconsistencias y vacíos de información. Nuestra misión como equipo de análisis de datos es embarcarnos en un viaje para convertir este caos en claridad, realizando un preprocesamiento exhaustivo para forjar una herramienta de análisis fiable y, finalmente, hacer que los datos cuenten la historia de la producción de maíz en Colombia.
3 Forjando la Herramienta
Todo gran análisis comienza con datos de alta calidad. Esta primera fase es la más crítica: es donde transformamos la materia prima —un conjunto de datos crudo y desordenado— en una base de datos limpia, coherente y lista para ser interrogada. Es el equivalente a afinar los instrumentos antes de un concierto.
3.1 Carga de Librerías y Segmentación del Cultivo
Nuestra historia comienza con un universo de información sobre toda la producción agrícola de la empresa. Para encontrar las respuestas sobre el maíz, nuestro primer paso es enfocar el lente, aislando la señal de nuestro cultivo de interés del ruido generado por los demás.
Explicación del código:Se cargan las librerías que nos acompañarán en este viaje analítico. Luego, se leen los datos y, mediante filter(), se segmenta el dataframe para crear una nueva base de datos que contiene exclusivamente los registros de MAÍZ
library(dplyr);library(stringr);library(ggplot2);library(tidyverse);library(knitr);library(kableExtra);library(RColorBrewer);library(patchwork);library(tidyr);library(naniar);library(corrplot);library(htmltools)
library(crosstalk);library(mice);library(plotly);library(readxl);library(table1);library(highcharter);library(brew)
datos <- readxl::read_excel("./DATOS/eva_df_2025.xlsx")
level_CULTIVO <- c(MAIZ = "MAIZ", maiz = "MAIZ")
datos <- datos %>% mutate(CULTIVO = recode(CULTIVO, !!!level_CULTIVO))
datos <- datos %>% filter(CULTIVO == "MAIZ")3.2 Cambio de Títulos Originales y Eliminación de Columnas Innecesarias
Los nombres de las columnas originales son poco intuitivos, lo que puede generar confusión o errores durante el análisis. Para trabajar de manera más eficiente y con un lenguaje común dentro del equipo, se redefinen los nombres de las variables con etiquetas claras y estandarizadas.
Además, se eliminan aquellas columnas que no aportan información relevante para el análisis actual con el fin de optimizar la base de datos y facilitar la interpretación de los resultados Explicación del código: Primero, se define un vector con los nuevos nombres de las columnas y se asigna directamente a la base de datos. Luego, se eliminan las variables innecesarias con select, dejando únicamente aquellas que serán utilizadas en los análisis posteriores.
3.3 Creación de la Variable Rendimiento
Producir mucho no es sinónimo de ser eficiente. La empresa necesita una métrica que mida la productividad por hectárea. Aquí es donde creamos al protagonista de nuestro análisis: la variable rendimiento.
Explicación del código: Usando ‘mutate()’, creamos la columna rendimiento. La fórmula t_produccion / area_cosechada se implementa con case_when() para manejar de forma robusta casos especiales, como divisiones por cero o datos faltantes, asegurando la calidad de nuestro indicador clave.
3.4 Identificación de Datos Faltantes
Antes de poder limpiar o modelar, un analista debe actuar como un detective. El primer paso es realizar un diagnóstico completo para encontrar los “huecos” en la información. No podemos tratar un problema que no entendemos, por lo que este apartado se dedica a mapear dónde y cuántos datos faltantes existen en nuestro conjunto de datos.
Explicación del código: Se utilizan tres herramientas complementarias. Primero, summary() nos da un conteo rápido y numérico de los NAs en cada columna. Segundo, vis_miss() del paquete naniar genera una “radiografía” visual de la base de datos, permitiéndonos identificar patrones de datos faltantes de un solo vistazo. Finalmente, con filter(), extraemos y creamos una tabla específica con las filas exactas donde nuestra variable de interés, rendimiento, tiene información faltante, para una inspección detallada.
| Antioquia (N=2096) |
Cundinamarca (N=1901) |
Huila (N=1715) |
Santander (N=1767) |
Valle del Cauca (N=1490) |
Overall (N=8969) |
|
|---|---|---|---|---|---|---|
| area_sembrada | ||||||
| Mean (SD) | 217 (550) | 166 (294) | 218 (252) | 97.8 (180) | 191 (374) | 179 (364) |
| Median [Min, Max] | 40.0 [1.00, 6280] | 60.0 [0, 3000] | 140 [2.00, 1950] | 50.0 [2.00, 3400] | 55.0 [1.00, 3250] | 60.0 [0, 6280] |
| area_cosechada | ||||||
| Mean (SD) | 207 (536) | 149 (277) | 213 (246) | 89.8 (170) | 185 (366) | 169 (354) |
| Median [Min, Max] | 35.0 [0, 6200] | 50.0 [0, 3000] | 135 [2.00, 1650] | 45.0 [0, 3350] | 51.5 [0, 3250] | 60.0 [0, 6200] |
| t_produccion | ||||||
| Mean (SD) | 340 (1010) | 237 (444) | 543 (662) | 179 (411) | 1040 (2500) | 442 (1230) |
| Median [Min, Max] | 42.0 [0, 12100] | 80.0 [0, 4990] | 285 [2.00, 5250] | 80.0 [0, 8270] | 138 [0, 21100] | 101 [0, 21100] |
| Missing | 19 (0.9%) | 23 (1.2%) | 17 (1.0%) | 17 (1.0%) | 14 (0.9%) | 90 (1.0%) |
| rendimiento | ||||||
| Mean (SD) | 1.42 (0.708) | 1.66 (0.763) | 2.61 (1.21) | 1.97 (1.00) | 3.64 (2.20) | 2.18 (1.45) |
| Median [Min, Max] | 1.20 [0, 7.00] | 1.50 [0, 8.75] | 3.00 [0.545, 7.14] | 1.81 [0, 14.0] | 3.00 [0, 8.50] | 1.60 [0, 14.0] |
| Missing | 19 (0.9%) | 23 (1.2%) | 17 (1.0%) | 17 (1.0%) | 14 (0.9%) | 90 (1.0%) |
datos %>%
filter(is.na(rendimiento)) %>%
select(-rendimiento) %>%
head(10) %>%
kable(caption = "Muestra de 10 Registros con Rendimiento Faltante de 90 ") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE)| departamento | municipio | cultivo | año | area_sembrada | area_cosechada | t_produccion |
|---|---|---|---|---|---|---|
| Santander | SOCORRO | MAIZ | 2006 | 77 | 65 | NA |
| Valle del Cauca | CARTAGO | MAIZ | 2006 | 1577 | 1577 | NA |
| Valle del Cauca | TORO | MAIZ | 2007 | 195 | 160 | NA |
| Huila | TARQUI | MAIZ | 2008 | 83 | 83 | NA |
| Valle del Cauca | CARTAGO | MAIZ | 2008 | 1342 | 1122 | NA |
| Huila | PAICOL | MAIZ | 2009 | 138 | 136 | NA |
| Valle del Cauca | ZARZAL | MAIZ | 2009 | 48 | 48 | NA |
| Antioquia | LA ESTRELLA | MAIZ | 2010 | 3 | 3 | NA |
| Huila | OPORAPA | MAIZ | 2011 | 150 | 145 | NA |
| Huila | ACEVEDO | MAIZ | 2012 | 825 | 823 | NA |
3.5 Imputación de Datos Faltantes
Para asegurar la calidad del análisis, se evaluó el impacto de diferentes estrategias para el tratamiento de los datos faltantes. Se realizó una comparación visual (mediante diagramas de caja) de las distribuciones de rendimiento bajo tres escenarios: eliminando los registros faltantes, imputando con la media por departamento y usando una imputación múltiple con MICE.
datos <- datos %>%
mutate(departamento = str_to_upper(departamento))
datos_limpios <- datos %>%
filter(!is.na(datos$rendimiento))
datos_imputados <- datos %>%
group_by(departamento) %>%
mutate(
rendimiento = ifelse(
is.na(rendimiento),
mean(rendimiento, na.rm = TRUE),
rendimiento
)
) %>%
ungroup()
imputR <- mice(datos, m = 5,method = "pmm", maxit = 5, seed = 123, print = FALSE)
Datos_ImputR <- complete(imputR)
datos_todos <- bind_rows(
datos_limpios %>% mutate(metodo_imputacion = "Sin NA"),
datos_imputados %>% mutate(metodo_imputacion = "Imputacion Dept"),
Datos_ImputR %>% mutate(metodo_imputacion = "Mice"))
ggplot(datos_todos, aes(x = departamento, y = rendimiento, fill = metodo_imputacion)) +
geom_boxplot(position = position_dodge(width = 0.8), outlier.alpha = 0.3) +
labs(
title = "Comparación de Métodos de Imputación de Rendimiento",
x = "Departamento",
y = "Rendimiento (unidades)"
) +
scale_fill_manual(values = c("Sin NA" = "#781C2E", "Imputacion Dept" = "#E86C1F", "Mice" = "#FFB347")) +
theme_minimal(base_size = 12) +
theme(plot.title = element_text(face = "bold", color = "darkred", hjust = 0.5))
Análisis de los Resultados Se observó que las
distribuciones de rendimiento para cada departamento eran prácticamente
idénticas en los tres casos. Esta falta de variación se explica por la
baja proporción de datos faltantes en el conjunto de datos
(aproximadamente un 0.2%). Como regla general, cuando la cantidad de
datos faltantes es inferior al 5%, el riesgo de introducir un sesgo
significativo en los resultados es bajo, independientemente del método
que se elija. A pesar de que el impacto fue insignificante, se optó por
utilizar la imputación con MICE como método definitivo para conservar la
totalidad de los registros, asegurando un conjunto de datos completo y
robusto. El resultado es Datos_ImputR, nuestro set de datos final:
completo, limpio y confiable para el análisis.
3.6 Tratamiento Final de Outliers: Filtrado por Desviación Estándar
En la comparación de los métodos de imputación, nos percatamos de que nuestros datos, incluso después de ser completados, presentaban numerosos datos atípicos comunes en varios departamentos. Para generar una base de datos más robusta y preparada para modelos sensibles a valores extremos, el siguiente paso es tratar estos outliers.
Para esto, optamos por utilizar el método del Z-score (o regla de las 3 desviaciones estándar). Si bien existen métodos más robustos a la asimetría como el de Tukey (IQR), elegimos el Z-score por ser un criterio estándar, objetivo y fácilmente interpretable. Este método nos permite aislar el cuerpo central de los datos, eliminando de forma rigurosa solo aquellos puntos que se encuentran en las colas más extremas de la distribución de cada departamento, asegurando así un conjunto de datos más homogéneo para los análisis posteriores.
Explicación del código: El proceso se divide en tres partes. Primero, realizamos el filtrado: agrupamos los datos por departamento y, para cada uno, calculamos su media y 3 veces su desviación estándar para definir los límites superior e inferior. Luego, eliminamos todas las filas cuyo rendimiento se encuentre fuera de este rango. Segundo, realizamos la visualización comparativa: creamos dos gráficos de caja, uno “antes” y otro “después” del filtrado, para confirmar visualmente el efecto de la limpieza. Finalmente, con la línea Datos_ImputR <- Datos_Sin_Outliers_ZScore, tomamos la decisión de actualizar nuestro data frame principal, continuando el resto del análisis con esta versión de los datos ya sin los outliers más extremos.
filas_originales <- nrow(Datos_ImputR)
Datos_Sin_Outliers_ZScore <- Datos_ImputR %>%
group_by(departamento) %>%
mutate(
media_depto = mean(rendimiento, na.rm = TRUE),
sd_depto = sd(rendimiento, na.rm = TRUE),
limite_superior = media_depto + 3 * sd_depto,
limite_inferior = media_depto - 3 * sd_depto
) %>%
filter(rendimiento >= limite_inferior & rendimiento <= limite_superior) %>%
ungroup() %>%
select(-media_depto, -sd_depto, -limite_superior, -limite_inferior)
filas_finales <- nrow(Datos_Sin_Outliers_ZScore)
rango_rendimiento <- range(Datos_ImputR$rendimiento, na.rm = TRUE)
p1 <- ggplot(Datos_ImputR, aes(x = reorder(departamento, rendimiento, FUN = median), y = rendimiento)) +
geom_boxplot(fill = "#E86C1F", alpha = 0.8) +
coord_flip(ylim = rango_rendimiento) +
labs(
title = "ANTES de Eliminar Outliers",
x = "Departamento",
y = "Rendimiento (Ton/Ha)"
) +
theme_minimal()
p2 <- ggplot(Datos_Sin_Outliers_ZScore, aes(x = reorder(departamento, rendimiento, FUN = median), y = rendimiento)) +
geom_boxplot(fill = "darkred", alpha = 0.8) +
coord_flip(ylim = rango_rendimiento) +
labs(
title = "DESPUÉS de Eliminar Outliers (Método Z-Score)",
x = "Departamento",
y = "Rendimiento (Ton/Ha)"
) +
theme_minimal()
p1 / p24 Extrayendo las Respuestas
Con nuestra herramienta de datos ya forjada y afinada, comienza la fase de exploración. Ahora podemos interrogar a los datos para que nos revelen sus secretos y nos guíen hacia decisiones de negocio más inteligentes.
4.1 Distribución de la muestra por departamentos
Antes de analizar el rendimiento, necesitamos mapear el terreno: ¿de dónde proviene nuestra información? Este mapa nos muestra la concentración de datos a nivel nacional.
datos_freq <- Datos_ImputR %>%
count(departamento)
numero_de_colores <- nrow(datos_freq)
paleta_rojos <- brewer.pal(n = numero_de_colores, name = "Reds")
p5 <- plot_ly(datos_freq,
labels = ~departamento,
values = ~n,
type = "pie",
marker = list(colors = paleta_rojos,
line = list(color = '#FFFFFF', width = 1))) %>%
layout(title = list(text = "<b> 4.1. Distribución de la muestra por Departamento</b>", font = list(color = "darkred", size = 15), x = 0.5, xanchor = "center"))
p5Análisis de los Resultados La distribución de la muestra está bien repartida entre los departamentos, lo que es positivo para el análisis, ya que las conclusiones generales no estarán fuertemente sesgadas por la información de una sola región.
Llama la atención que Valle del Cauca, a pesar de ser el departamento con la menor cantidad de registros en este conjunto de datos, fue el que demostró tener el rendimiento más alto y consistente en los análisis anteriores. Esto sugiere que su alta productividad no es un artefacto de tener una muestra más grande, sino una característica real de la región.
4.2 comportamiento del rendimiento del cultivo por departamento.
Una vez que mapeamos la procedencia de nuestros datos, el siguiente paso es analizar al protagonista de nuestra historia: el rendimiento. Este gráfico nos permite comparar la eficiencia productiva de cada departamento, no solo en su valor típico, sino en toda su distribución, revelando su consistencia, variabilidad y la presencia de casos excepcionales.
Explicación del código: Utilizamos ggplot2 para generar un diagrama de cajas (geom_boxplot) por cada departamento. La función reorder() ordena los departamentos en el eje X según su rendimiento mediano, lo que facilita una comparación visual inmediata del desempeño. Finalmente, scale_fill_manual() aplica la paleta de colores del espectro rojo para mantener la consistencia visual del informe.
deptos_ordenados <- Datos_ImputR %>%
group_by(departamento) %>%
summarise(mediana_rendimiento = median(rendimiento, na.rm = TRUE)) %>%
arrange(mediana_rendimiento) %>%
pull(departamento)
paleta_rojos_ordenada <- brewer.pal(n = length(deptos_ordenados), name = "Reds")
names(paleta_rojos_ordenada) <- deptos_ordenados
p_boxplot <- ggplot(Datos_ImputR, aes(
x = reorder(departamento, rendimiento, FUN = median),
y = rendimiento,
fill = departamento
)) +
geom_boxplot(outlier.alpha = 0.4) +
scale_fill_manual(values = paleta_rojos_ordenada) +
labs(
title = "4.2. Comportamiento del Rendimiento del Maíz por Departamento",
x = "Departamento",
y = "Rendimiento (Toneladas/Hectárea)"
) +
theme_minimal() +
theme(
legend.position = "none",
axis.text.x = element_text(angle = 45, hjust = 1),
plot.title = element_text(
color = "darkred",
size = 12,
face = "bold",
hjust = 0.5))
p6 <- ggplotly(p_boxplot)
p6Análisis de los Resultados El gráfico revela un claro ranking de desempeño, ordenado de menor a mayor rendimiento mediano. Valle del Cauca y Huila se consolidan como el grupo de alto rendimiento, con las medianas más altas. En contraste, Antioquia, Cundinamarca y Santander forman un grupo de menor rendimiento típico.
Sin embargo, la historia más profunda está en la variabilidad y los outliers: Valle del Cauca muestra una gran dispersión en sus datos (una caja muy alta), indicando que un amplio rango de rendimientos es normal para la región. Por otro lado, los departamentos de bajo rendimiento presentan cajas más compactas pero con numerosos outliers en la parte superior. Esto nos dice que, aunque su rendimiento habitual es modesto, tienen un historial de casos excepcionales de alta productividad, un patrón que difiere fundamentalmente del comportamiento del Valle del Cauca, donde esos mismos valores altos son parte de la norma.
4.3 Comparación del rendimiento en 2007 vs. 2017
El negocio no es estático. Para entender el presente, debemos mirar al pasado. Este análisis nos cuenta la historia de una década de cambio.
Explicación del código: Filtramos los datos para los años 2007 y 2017. geom_col con position = “dodge” crea un gráfico de barras comparativo que muestra la evolución del rendimiento mediano en cada departamento.
datos_comparacion <- Datos_ImputR %>% filter(año %in% c(2007, 2017)) %>% group_by(departamento, año) %>% summarise(rendimiento_mediano = median(rendimiento, na.rm = TRUE), .groups = 'drop')
p7 <- datos_comparacion %>%
hchart("column",
hcaes(x = departamento, y = rendimiento_mediano, group = año)) %>%
hc_title(text = "<b> 4.3. Comparación de Rendimiento Mediano: 2007 vs. 2017 <b/>") %>%
hc_yAxis(min = 0,
max = 3.5,
tickInterval = 0.5,
title = list(text = "Rendimiento Mediano (Ton/Ha)")) %>%
hc_xAxis(title = list(text = "Departamento")) %>%
hc_colors(c("#E86C1F", "#781C2E")) %>%
hc_legend(enabled = TRUE)
p7Análisis de los Resultados Se observa una tendencia de mejora generalizada, ya que todos los departamentos analizados incrementaron su rendimiento mediano en el transcurso de la década. El cambio más notable es el de Huila, que experimentó un crecimiento espectacular, pasando de ser un competidor fuerte en 2007 a posicionarse como el líder en rendimiento en 2017, superando incluso a Valle del Cauca. A pesar de la mejora colectiva, la brecha de productividad entre los departamentos de alto rendimiento (Huila y Valle del Cauca) y los de menor rendimiento (Antioquia, Cundinamarca y Santander) se mantuvo, evidenciando diferencias estructurales en la eficiencia agrícola regional.
4.4 Tendencia del rendimiento a través de los años
Esta visualización nos cuenta la historia completa a través del tiempo. ¿Qué departamentos han mostrado un crecimiento sostenido? ¿Cuáles se han estancado o han sido erráticos?
Explicación del código: Agrupamos por año y departamento para calcular el rendimiento mediano anual. geom_line conecta los puntos a lo largo del tiempo, revelando la trayectoria de cada departamento.
tendencia_anual <- Datos_ImputR %>%
group_by(año, departamento) %>%
summarise(rendimiento_mediano = median(rendimiento, na.rm = TRUE), .groups = "drop")
p8 <- highchart() %>%
hc_title(text = "<b> 4.4. Tendencia Anual del Rendimiento por Departamento <b/>") %>%
hc_xAxis(title = list(text = "Año"),
categories = sort(unique(tendencia_anual$año))) %>%
hc_yAxis( max = 3.5,tickInterval = 0.5,title = list(text = "Rendimiento Mediano (Ton/Ha)")) %>%
hc_add_series(data = tendencia_anual,
type = "line",
hcaes(x = año, y = rendimiento_mediano, group = departamento)) %>%
hc_colors(c("#781C2E", "#E86C1F", "#FFB347", "#5D001E", "#C1440E")) %>%
hc_legend(enabled = TRUE, align = "center", verticalAlign = "bottom") %>%
hc_chart(backgroundColor = "#FFFFFF")
p8Análisis de los Resultados la tendencia anual del rendimiento mediano revela dinámicas de producción marcadamente diferentes entre los departamentos. Mientras Valle del Cauca mantiene un rendimiento consistentemente alto pero volátil, la historia principal es la de Huila, que demuestra una clara y sostenida tendencia de crecimiento hasta posicionarse como el líder en productividad al final del periodo, alcanzando el pico más alto del análisis en 2016. En contraste, observamos que Santander, Antioquia y Cundinamarca presentan un comportamiento mayormente estancado en niveles de rendimiento inferiores, sin mejoras significativas durante la década. Notablemente, la caída sincronizada del rendimiento en varias regiones alrededor de los años 2011-2012 sugiere fuertemente el impacto de un evento generalizado, probablemente de naturaleza climática, que afectó al sector a nivel nacional.
4.5 Tablero Gráfico Resumen
Para la toma de decisiones estratégicas, los directivos necesitan una visión global, consolidada y rápida. En lugar de presentar nuestros hallazgos como una secuencia de gráficos individuales, los integramos en un único tablero de mando interactivo. Esta herramienta consolida nuestros análisis más importantes —desde la distribución de la muestra hasta la comparación y evolución del rendimiento— en una sola vista, permitiendo a la dirección explorar los datos y conectar las conclusiones de forma intuitiva.
Explicación del código: Para construir este tablero, utilizamos las herramientas de htmltools. La función tagList() actúa como un contenedor principal para nuestros elementos. Dentro de ella, bscols() nos permite organizar los gráficos en un sistema de filas y columnas basado en una cuadrícula de 12 unidades. Primero, creamos una fila para el gráfico p5 que ocupa el ancho completo (widths = c(12)). Luego, una segunda fila que se divide en dos columnas de igual tamaño (widths = c(6, 6)) para los gráficos p6 y p7. Finalmente, div() crea una tercera fila para el gráfico p8, añadiendo un pequeño margen superior para una mejor separación visual. El resultado es un diseño de informe profesional y organizado.
browsable(
tagList(
bscols(
widths = c(12),
p5
),
bscols(
widths = c(6, 6),
p6, p7
),
div(style="margin-top:20px;", p8)
)
)4.6 Tabla de Indicadores Descriptivos
Mientras que los gráficos nos dan la intuición, las decisiones de negocio requieren los números detrás de las imágenes. Esta tabla proporciona las estadísticas descriptivas precisas.
Explicación del código: Para obtener un resumen estadístico detallado, creamos una plantilla de renderizado personalizada para la función table1(). Esta plantilla le da instrucciones a la función para que, por cada variable numérica, calcule y muestre explícitamente la Media, Desviación Estándar, Varianza, Mediana con sus cuartiles, y el Rango. Luego, aplicamos esta plantilla a nuestra variable rendimiento, agrupando los resultados por departamento para generar la tabla comparativa final.
render.nuevo <- function(x) {
media <- mean(x, na.rm = TRUE)
desv_est <- sd(x, na.rm = TRUE)
varianza <- var(x, na.rm = TRUE)
mediana <- median(x, na.rm = TRUE)
q1 <- quantile(x, 0.25, na.rm = TRUE)
q3 <- quantile(x, 0.75, na.rm = TRUE)
min_val <- min(x, na.rm = TRUE)
max_val <- max(x, na.rm = TRUE)
c(
"",
"Media" = format(round(media, 2), nsmall = 2),
"Desviación Estándar" = format(round(desv_est, 2), nsmall = 2),
"Varianza" = format(round(varianza, 2), nsmall = 2),
"Mediana [Q1, Q3]" = sprintf("%s [%s, %s]",
format(round(mediana, 2), nsmall = 2),
format(round(q1, 2), nsmall = 2),
format(round(q3, 2), nsmall = 2)),
"Rango (Mín - Máx)" = sprintf("%s - %s",
format(round(min_val, 2), nsmall = 2),
format(round(max_val, 2), nsmall = 2))
)
}
table1(~ rendimiento | departamento,
data = Datos_ImputR,
topclass="Rtable1-zebra",
render.continuous = render.nuevo)| ANTIOQUIA (N=2065) |
CUNDINAMARCA (N=1869) |
HUILA (N=1710) |
SANTANDER (N=1745) |
VALLE DEL CAUCA (N=1490) |
Overall (N=8879) |
|
|---|---|---|---|---|---|---|
| rendimiento | ||||||
| Media | 1.38 | 1.60 | 2.60 | 1.92 | 3.63 | 2.14 |
| Desviación Estándar | 0.57 | 0.56 | 1.19 | 0.84 | 2.20 | 1.41 |
| Varianza | 0.33 | 0.32 | 1.43 | 0.70 | 4.85 | 1.99 |
| Mediana [Q1, Q3] | 1.20 [1.00, 1.64] | 1.50 [1.20, 2.00] | 3.00 [1.43, 3.63] | 1.80 [1.33, 2.40] | 3.00 [1.70, 5.51] | 1.60 [1.25, 2.50] |
| Rango (Mín - Máx) | 0.00 - 3.51 | 0.00 - 4.00 | 0.55 - 6.00 | 0.00 - 5.00 | 0.00 - 8.50 | 0.00 - 8.50 |
Análisis de los Resultados La tabla cuantifica nuestras observaciones visuales y revela tres conclusiones clave. Primero, confirma el ranking de rendimiento: Valle del Cauca y Huila son los líderes indiscutibles con una mediana idéntica de 3.00 Ton/Ha, muy por encima de los demás. Segundo, la tabla nos da la prueba numérica del impacto de los outliers: en Antioquia, Cundinamarca y Santander, la media es notablemente superior a la mediana (ej. Santander: Media 1.92 vs. Mediana 1.80), confirmando que los valores atípicos “inflan” el promedio. Finalmente, la variabilidad queda claramente expuesta: Valle del Cauca tiene una Varianza (4.85) y Desviación Estándar (2.20) masivas en comparación con los otros departamentos, lo que demuestra numéricamente que su producción, aunque alta, es la más inconsistente o diversa.
5 Conclusión
Nuestro viaje a través de los datos de las Evaluaciones Agropecuarias Municipales comenzó con un objetivo claro: realizar un análisis exploratorio para transformar un conjunto de datos brutos en una narrativa coherente que pudiera guiar las decisiones estratégicas de la empresa. Lo que encontramos fue una historia fascinante, demostrando lo hermosa y compleja que puede ser esta gran labor de análisis.
El preprocesamiento, desde la estandarización de nombres hasta la robusta imputación de datos faltantes y el cuidadoso análisis de valores atípicos, no fue un mero ejercicio técnico, sino el pilar fundamental que nos permitió construir una base de datos confiable. Fue solo a través de este riguroso proceso que pudimos escuchar lo que los datos realmente tenían que decir.
A través de nuestras visualizaciones y análisis, los datos nos revelaron tres realidades productivas distintas. Descubrimos que Valle del Cauca no es solo un líder en rendimiento, sino un departamento con una alta variabilidad inherente donde la excelencia es parte de la norma. Vimos la impresionante trayectoria de crecimiento de Huila, que lo posicionó como un competidor de primer nivel y un caso de éxito en mejora continua. Y, quizás lo más importante, caracterizamos a Antioquia, Cundinamarca y Santander como regiones de rendimiento típico modesto, pero con “bolsas” de éxito excepcional que se manifestaron como outliers, representando oportunidades clave para el aprendizaje y la replicación de buenas prácticas.
6 Referencias
Barrett, D. (2021). table1: Tables of Descriptive Statistics in HTML. R package version 1.4.2. https://github.com/benjamin-sabord/table1
Bermudez Vera, I. M. (2025). Evaluaciones Agropecuarias Municipales - EVA (eva_df_2025.xls) [Conjunto de datos]. Curso de Gestión de Datos, Escuela de Estadística, Universidad del Valle.
Cheng, J., & Sievert, C. (2021). crosstalk: Inter-Widget Interactivity for HTML. R package version 1.2.0. https://rstudio.github.io/crosstalk/
Kunst, J. B. (2017). highcharter: A Wrapper for the ‘Highcharts’ Library. R package version 0.5.0. http://jkunst.com/highcharter/
Neuwirth, E. (2022). RColorBrewer: ColorBrewer Palettes. R package version 1.1-3.
Pedersen, T. L. (2020). patchwork: The Composer of Plots. R package version 1.1.1. https://patchwork.data-imaginist.com
R Core Team (2025). R: A language and environment for statistical computing. R Foundation for Statistical Computing, Vienna, Austria. https://www.R-project.org/.
Sievert, C. (2020). Interactive Web-Based Data Visualization with R, plotly, and shiny. Chapman and Hall/CRC. https://plotly-r.com
Tierney, N., & Cook, D. (2023). naniar: Data Structures, Summaries, and Visualisations for Missing Data. R package version 1.0.0. https://njtierney.github.io/naniar/
van Buuren, S., & Groothuis-Oudshoorn, K. (2011). mice: Multivariate Imputation by Chained Equations in R. Journal of Statistical Software, 45(3), 1–67. https://www.jstatsoft.org/v45/i03/.
Wickham, H., Averick, M., Bryan, J., Chang, W., McGowan, L. D., François, R., Grolemund, G., Hayes, A., Henry, L., Hester, J., Kuhn, M., Pedersen, T. L., Miller, E., Bache, S. M., Müller, K., Ooms, J., Robinson, D., Seidel, D. P., Spinu, V., … Yutani, H. (2019). Welcome to the tidyverse. Journal of Open Source Software, 4(43), 1686. https://doi.org/10.21105/joss.01686.
Wickham, H., & Bryan, J. (2023). readxl: Read Excel Files. R package version 1.4.3. https://readxl.tidyverse.org
Zhu, H. (2021). kableExtra: Construct Complex Table with ‘kable’ and Pipe Syntax. R package version 1.3.4. http://haozhu233.github.io/kableExtra/